package main

import "fmt"

func main() {
	//channelTest()
	//channelTest2()
	//closeChannelTest()
	closeChannelTest2()
}

func channelTest() {
	// 演示管道的使用
	// 1、创建一个可以存放3个int类型的管道（make的时候是多少就是多少，不会再动态增加）
	var intChan chan int = make(chan int, 3)

	// 2、看看intChan是什么
	fmt.Printf("intChand 的值是: %v, intChan本身的地址是: %v\n", intChan, &intChan)

	// 3、向管道写入数据
	num := 211
	intChan <- num
	intChan <- 10
	intChan <- 20

	// 4、看看管道的长度和cap（容量）
	fmt.Printf("intChan len: %v, cap: %v\n", len(intChan), cap(intChan))

	// 5、注意，当我们给管道写入数据时，不可以超过其容量
	// intChan <- 10
	// intChan <- 10
	// 报错 fatal error: all goroutines are asleep - deadlock!

	// 6、从管道中读取数据（先进先出， 取到的是211, 长度）
	num2 := <-intChan
	fmt.Printf("intChan取出的数据是: %v, len: %v, cap: %v\n", num2, len(intChan), cap(intChan))

	// 7、在没有使用协程的情况下， 如果管道数据已经全部取出，再取就会报告 deadlock
	num3 := <-intChan
	fmt.Printf("intChan取出的数据是: %v, len: %v, cap: %v\n", num3, len(intChan), cap(intChan))
	num4 := <-intChan
	fmt.Printf("intChan取出的数据是: %v, len: %v, cap: %v\n", num4, len(intChan), cap(intChan))
	num5 := <-intChan
	fmt.Printf("intChan取出的数据是: %v, len: %v, cap: %v\n", num5, len(intChan), cap(intChan))
}

type Cat struct {
	Name string
}

func channelTest2() {
	allChan := make(chan interface{}, 3)
	cat1 := Cat{Name: "tom"}
	allChan <- cat1
	allChan <- 10
	cat11 := <-allChan
	cat12 := cat11.(Cat)
	fmt.Println(cat12.Name)
}

func closeChannelTest() {
	intChan := make(chan int, 3)
	intChan <- 100
	intChan <- 200
	close(intChan)
	num1 := <-intChan
	fmt.Println(num1)
	intChan <- 300
}

func closeChannelTest2() {
	intChan := make(chan int, 100)
	for i := 0; i < 100; i++ {
		intChan <- i * 2
	}
	close(intChan)
	for v := range intChan {
		fmt.Println("v:", v)
	}

}
